JavaScriptμ λΉλκΈ° 컨ν μ€νΈμ μμ² λ²μ λ³μλ₯Ό ν¨κ³Όμ μΌλ‘ κ΄λ¦¬νλ λ°©λ²μ μμ보μΈμ. AsyncLocalStorage, μ¬μ© μ¬λ‘, λͺ¨λ² μ¬λ‘ λ° λΉλκΈ° νκ²½μμ 컨ν μ€νΈλ₯Ό μ μ§νκΈ° μν λμμ λν΄ μμ보μΈμ.
JavaScript λΉλκΈ° 컨ν μ€νΈ: λΉλκΈ° μμ μ λ°μμ μμ² λ²μ λ³μ κ΄λ¦¬
λΉλκΈ° νλ‘κ·Έλλ°μ νλ JavaScript κ°λ°μ μ΄μμ΄λ©°, νΉν λ
ΌλΈλ‘νΉ I/Oκ° μ±λ₯μ μ€μν Node.jsμ κ°μ νκ²½μμ κ·Έλ μ΅λλ€. κ·Έλ¬λ λΉλκΈ° μμ
μ λ°μμ 컨ν
μ€νΈλ₯Ό κ΄λ¦¬νλ κ²μ μ΄λ €μΈ μ μμ΅λλ€. λ°λ‘ μ΄ μ§μ μμ JavaScriptμ λΉλκΈ° 컨ν
μ€νΈ, νΉν AsyncLocalStorage
κ° λ±μ₯ν©λλ€.
λΉλκΈ° 컨ν μ€νΈλ 무μμΈκ°?
λΉλκΈ° 컨ν μ€νΈλ λΉλκΈ° μμ μ μλͺ μ£ΌκΈ° λμ μ μ§λλ λ°μ΄ν°μ λΉλκΈ° μμ μ μ°κ²°νλ κΈ°λ₯μ μλ―Έν©λλ€. μ΄λ μ¬λ¬ λΉλκΈ° νΈμΆμμ μμ² λ²μ μ 보(μ: μ¬μ©μ ID, μμ² ID, μΆμ μ 보)λ₯Ό μ μ§ν΄μΌ νλ μλ리μ€μ νμμ μ λλ€. μ μ ν 컨ν μ€νΈ κ΄λ¦¬κ° μμΌλ©΄ λλ²κΉ , λ‘κΉ λ° λ³΄μμ΄ ν¨μ¬ λ μ΄λ €μμ§ μ μμ΅λλ€.
λΉλκΈ° μμ μμ 컨ν μ€νΈ μ μ§μ μ΄λ €μ
ν¨μ νΈμΆμ ν΅ν΄ λ³μλ₯Ό λͺ μμ μΌλ‘ μ λ¬νλ κ²κ³Ό κ°μ κΈ°μ‘΄μ 컨ν μ€νΈ κ΄λ¦¬ λ°©μμ λΉλκΈ° μ½λμ 볡μ‘μ±μ΄ μ¦κ°ν¨μ λ°λΌ λ²κ±°λ‘κ³ μ€λ₯κ° λ°μνκΈ° μ½μ΅λλ€. μ½λ°± μ§μ₯κ³Ό νλ‘λ―Έμ€ μ²΄μΈμ 컨ν μ€νΈ νλ¦μ κ°λ¦΄ μ μμ΄ μ μ§ κ΄λ¦¬ λ¬Έμ μ μ μ¬μ μΈ λ³΄μ μ·¨μ½μ μΌλ‘ μ΄μ΄μ§ μ μμ΅λλ€. λ€μμ λ¨μνλ μλ₯Ό κ³ λ €ν΄ λ³΄μμμ€.
function processRequest(req, res) {
const userId = req.userId;
fetchData(userId, (data) => {
transformData(userId, data, (transformedData) => {
logData(userId, transformedData, () => {
res.send(transformedData);
});
});
});
}
μ΄ μμμ userId
λ μ€μ²©λ μ½λ°±μ ν΅ν΄ λ°λ³΅μ μΌλ‘ μ λ¬λ©λλ€. μ΄ μ κ·Ό λ°©μμ μ₯ν©ν λΏλ§ μλλΌ ν¨μλ₯Ό κΈ΄λ°νκ² κ²°ν©νμ¬ μ¬μ¬μ©μ±μ΄ λ¨μ΄μ§κ³ ν
μ€νΈνκΈ°κ° λ μ΄λ ΅μ΅λλ€.
AsyncLocalStorage μκ°
AsyncLocalStorage
λ νΉμ λΉλκΈ° 컨ν
μ€νΈμ λ‘μ»¬μΈ λ°μ΄ν°λ₯Ό μ μ₯νλ λ©μ»€λμ¦μ μ 곡νλ Node.jsμ λ΄μ₯ λͺ¨λμ
λλ€. λμΌν μ€ν 컨ν
μ€νΈ λ΄μμ λΉλκΈ° κ²½κ³λ₯Ό λμ΄ μλμΌλ‘ μ νλλ κ°μ μ€μ νκ³ κ²μν μ μμ΅λλ€. μ΄λ μμ² λ²μ λ³μμ κ΄λ¦¬λ₯Ό ν¬κ² λ¨μνν©λλ€.
AsyncLocalStorage μλ λ°©μ
AsyncLocalStorage
λ νμ¬ λΉλκΈ° μμ
κ³Ό μ°κ²°λ μ€ν λ¦¬μ§ μ»¨ν
μ€νΈλ₯Ό μμ±νμ¬ μλν©λλ€. μλ‘μ΄ λΉλκΈ° μμ
(μ: νλ‘λ―Έμ€, μ½λ°±)μ΄ μμλλ©΄ μ€ν λ¦¬μ§ μ»¨ν
μ€νΈκ° μ μμ
μΌλ‘ μλ μ νλ©λλ€. μ΄λ κ² νλ©΄ μ 체 λΉλκΈ° νΈμΆ 체μΈμμ λμΌν λ°μ΄ν°μ μ‘μΈμ€ν μ μμ΅λλ€.
AsyncLocalStorageμ κΈ°λ³Έ μ¬μ©λ²
λ€μμ AsyncLocalStorage
λ₯Ό μ¬μ©νλ κΈ°λ³Έ μμ
λλ€.
const { AsyncLocalStorage } = require('async_hooks');
const asyncLocalStorage = new AsyncLocalStorage();
function processRequest(req, res) {
const userId = req.userId;
asyncLocalStorage.run(new Map(), () => {
asyncLocalStorage.getStore().set('userId', userId);
fetchData().then(data => {
return transformData(data);
}).then(transformedData => {
return logData(transformedData);
}).then(() => {
res.send(transformedData);
});
});
}
async function fetchData() {
const userId = asyncLocalStorage.getStore().get('userId');
// ... userIdλ₯Ό μ¬μ©νμ¬ λ°μ΄ν° κ°μ Έμ€κΈ°
return data;
}
async function transformData(data) {
const userId = asyncLocalStorage.getStore().get('userId');
// ... userIdλ₯Ό μ¬μ©νμ¬ λ°μ΄ν° λ³ν
return transformedData;
}
async function logData(data) {
const userId = asyncLocalStorage.getStore().get('userId');
// ... userIdλ₯Ό μ¬μ©νμ¬ λ°μ΄ν° λ‘κΉ
return;
}
μ΄ μμμ:
AsyncLocalStorage
μ μΈμ€ν΄μ€λ₯Ό μμ±ν©λλ€.processRequest
ν¨μμμasyncLocalStorage.run
μ μ¬μ©νμ¬ μ μ€ν λ¦¬μ§ μΈμ€ν΄μ€(μ΄ κ²½μ°Map
)μ 컨ν μ€νΈ λ΄μμ ν¨μλ₯Ό μ€νν©λλ€.asyncLocalStorage.getStore().set('userId', userId)
λ₯Ό μ¬μ©νμ¬ μ€ν 리μ§μuserId
λ₯Ό μ€μ ν©λλ€.- λΉλκΈ° μμ
(
fetchData
,transformData
,logData
) λ΄μμasyncLocalStorage.getStore().get('userId')
λ₯Ό μ¬μ©νμ¬userId
λ₯Ό κ²μν μ μμ΅λλ€.
AsyncLocalStorageμ μ¬μ© μ¬λ‘
AsyncLocalStorage
λ λ€μκ³Ό κ°μ μλ리μ€μμ νΉν μ μ©ν©λλ€.
1. μμ² μΆμ
λΆμ° μμ€ν
μμ μ±λ₯μ λͺ¨λν°λ§νκ³ λ³λͺ© νμμ μλ³νλ €λ©΄ μ¬λ¬ μλΉμ€μμ μμ²μ μΆμ νλ κ²μ΄ μ€μν©λλ€. AsyncLocalStorage
λ₯Ό μ¬μ©νμ¬ μλΉμ€ κ²½κ³λ₯Ό λμ΄ μ νλλ κ³ μ ν μμ² IDλ₯Ό μ μ₯ν μ μμ΅λλ€. μ΄λ₯Ό ν΅ν΄ μλ‘ λ€λ₯Έ μλΉμ€μ λ‘κ·Έμ λ©νΈλ¦μ μνΈ μ°κ΄μμΌ μμ² μ¬μ μ λν ν¬κ΄μ μΈ λ³΄κΈ°λ₯Ό μ 곡ν μ μμ΅λλ€. μλ₯Ό λ€μ΄ μ¬μ©μ μμ²μ΄ API κ²μ΄νΈμ¨μ΄, μΈμ¦ μλΉμ€ λ° λ°μ΄ν° μ²λ¦¬ μλΉμ€λ₯Ό κ±°μΉλ λ§μ΄ν¬λ‘ μλΉμ€ μν€ν
μ²λ₯Ό κ³ λ €ν΄ λ³΄μμμ€. AsyncLocalStorage
λ₯Ό μ¬μ©νλ©΄ API κ²μ΄νΈμ¨μ΄μμ κ³ μ ν μμ² IDλ₯Ό μμ±νκ³ μμ² μ²λ¦¬μ κ΄λ ¨λ λͺ¨λ νμ μλΉμ€λ‘ μλ μ νν μ μμ΅λλ€.
2. λ‘κΉ μ»¨ν μ€νΈ
μ΄λ²€νΈλ₯Ό λ‘κΉ
ν λ μ¬μ©μ ID, μμ² ID λλ μΈμ
IDμ κ°μ 컨ν
μ€νΈ μ 보λ₯Ό ν¬ν¨νλ κ²μ΄ μ μ©ν κ²½μ°κ° λ§μ΅λλ€. AsyncLocalStorage
λ₯Ό μ¬μ©νμ¬ μ΄ μ 보λ₯Ό λ‘κ·Έ λ©μμ§μ μλμΌλ‘ ν¬ν¨νμ¬ λ¬Έμ λ₯Ό λ μ½κ² λλ²κΉ
νκ³ λΆμν μ μμ΅λλ€. μ ν리μΌμ΄μ
λ΄μμ μ¬μ©μ νλμ μΆμ ν΄μΌ νλ μλ리μ€λ₯Ό μμν΄ λ³΄μμμ€. AsyncLocalStorage
μ μ¬μ©μ IDλ₯Ό μ μ₯νλ©΄ ν΄λΉ μ¬μ©μ μΈμ
κ³Ό κ΄λ ¨λ λͺ¨λ λ‘κ·Έ λ©μμ§μ μλμΌλ‘ ν¬ν¨νμ¬ μ¬μ©μ νλκ³Ό λ°μν μ μλ μ μ¬μ μΈ λ¬Έμ μ λν κ·μ€ν ν΅μ°°λ ₯μ μ 곡ν μ μμ΅λλ€.
3. μΈμ¦ λ° κΆν λΆμ¬
AsyncLocalStorage
λ₯Ό μ¬μ©νμ¬ μ¬μ©μμ μν λ° κΆνκ³Ό κ°μ μΈμ¦ λ° κΆν λΆμ¬ μ 보λ₯Ό μ μ₯ν μ μμ΅λλ€. μ΄λ₯Ό ν΅ν΄ λͺ¨λ ν¨μμ μ¬μ©μ μ격 μ¦λͺ
μ λͺ
μμ μΌλ‘ μ λ¬νμ§ μκ³ λ μ ν리μΌμ΄μ
μ 체μμ μ‘μΈμ€ μ μ΄ μ μ±
μ μ μ©ν μ μμ΅λλ€. μλ‘ λ€λ₯Έ μ¬μ©μκ° μλ‘ λ€λ₯Έ μ‘μΈμ€ μμ€(μ: κ΄λ¦¬μ, μΌλ° κ³ κ°)μ κ°λ μ μ μκ±°λ μ ν리μΌμ΄μ
μ κ³ λ €ν΄ λ³΄μμμ€. AsyncLocalStorage
μ μ¬μ©μ μν μ μ μ₯νλ©΄ νΉμ μμ
μ μννλλ‘ νμ©νκΈ° μ μ ν΄λΉ κΆνμ μ½κ² νμΈν μ μμΌλ―λ‘ κΆνμ΄ μλ μ¬μ©μλ§ μ€μν λ°μ΄ν° λλ κΈ°λ₯μ μ‘μΈμ€ν μ μμ΅λλ€.
4. λ°μ΄ν°λ² μ΄μ€ νΈλμμ
λ°μ΄ν°λ² μ΄μ€λ‘ μμ
ν λ μ¬λ¬ λΉλκΈ° μμ
μμ νΈλμμ
μ κ΄λ¦¬ν΄μΌ νλ κ²½μ°κ° λ§μ΅λλ€. AsyncLocalStorage
λ₯Ό μ¬μ©νμ¬ λ°μ΄ν°λ² μ΄μ€ μ°κ²° λλ νΈλμμ
κ°μ²΄λ₯Ό μ μ₯νμ¬ λμΌν μμ² λ΄μ λͺ¨λ μμ
μ΄ λμΌν νΈλμμ
λ΄μμ μ€νλλλ‘ ν μ μμ΅λλ€. μλ₯Ό λ€μ΄ μ¬μ©μκ° μ£Όλ¬Έμ νλ κ²½μ° μ¬λ¬ ν
μ΄λΈ(μ: orders, order_items, inventory)μ μ
λ°μ΄νΈν΄μΌ ν μ μμ΅λλ€. AsyncLocalStorage
μ λ°μ΄ν°λ² μ΄μ€ νΈλμμ
κ°μ²΄λ₯Ό μ μ₯νλ©΄ μ΄λ¬ν λͺ¨λ μ
λ°μ΄νΈκ° λ¨μΌ νΈλμμ
λ΄μμ μνλμ΄ μμμ± λ° μΌκ΄μ±μ 보μ₯ν μ μμ΅λλ€.
5. λ€μ€ ν λμ
λ€μ€ ν
λνΈ μ ν리μΌμ΄μ
μμλ κ° ν
λνΈμ λν λ°μ΄ν°μ 리μμ€λ₯Ό 격리νλ κ²μ΄ νμμ μ
λλ€. AsyncLocalStorage
λ₯Ό μ¬μ©νμ¬ ν
λνΈ IDλ₯Ό μ μ₯νμ¬ νμ¬ ν
λνΈλ₯Ό κΈ°λ°μΌλ‘ μμ²μ μ μ ν λ°μ΄ν° μ μ₯μ λλ 리μμ€λ‘ λμ μΌλ‘ λΌμ°ν
ν μ μμ΅λλ€. μ¬λ¬ μ‘°μ§μμ λμΌν μ ν리μΌμ΄μ
μΈμ€ν΄μ€λ₯Ό μ¬μ©νλ SaaS νλ«νΌμ μμν΄ λ³΄μμμ€. AsyncLocalStorage
μ ν
λνΈ IDλ₯Ό μ μ₯νλ©΄ κ° μ‘°μ§μ λ°μ΄ν°κ° λΆλ¦¬λκ³ μ체 리μμ€μλ§ μ‘μΈμ€ν μ μμ΅λλ€.
AsyncLocalStorage μ¬μ©μ μν λͺ¨λ² μ¬λ‘
AsyncLocalStorage
λ κ°λ ₯ν λꡬμ΄μ§λ§ μ μ¬μ μΈ μ±λ₯ λ¬Έμ λ₯Ό λ°©μ§νκ³ μ½λ λͺ
νμ±μ μ μ§νλ €λ©΄ μ μ€νκ² μ¬μ©νλ κ²μ΄ μ€μν©λλ€. λ€μμ μΌλμ λμ΄μΌ ν λͺ κ°μ§ λͺ¨λ² μ¬λ‘μ
λλ€.
1. λ°μ΄ν° μ€ν λ¦¬μ§ μ΅μν
AsyncLocalStorage
μ μ λμ μΌλ‘ νμν λ°μ΄ν°λ§ μ μ₯ν©λλ€. λ§μ μμ λ°μ΄ν°λ₯Ό μ μ₯νλ©΄ νΉν λμμ±μ΄ λμ νκ²½μμ μ±λ₯μ μν₯μ λ―ΈμΉ μ μμ΅λλ€. μλ₯Ό λ€μ΄ μ 체 μ¬μ©μ κ°μ²΄λ₯Ό μ μ₯νλ λμ μ¬μ©μ IDλ§ μ μ₯νκ³ νμν λ μΊμ λλ λ°μ΄ν°λ² μ΄μ€μμ μ¬μ©μ κ°μ²΄λ₯Ό κ²μνλ κ²μ κ³ λ €ν΄ λ³΄μμμ€.
2. κ³Όλν 컨ν μ€νΈ μ ν λ°©μ§
μ¦μ 컨ν
μ€νΈ μ νμ μ±λ₯μ μν₯μ λ―ΈμΉ μλ μμ΅λλ€. AsyncLocalStorage
μμ κ°μ μ€μ νκ³ κ²μνλ νμλ₯Ό μ΅μνν©λλ€. μ€ν λ¦¬μ§ μ»¨ν
μ€νΈμ μ‘μΈμ€νλ μ€λ²ν€λλ₯Ό μ€μ΄κΈ° μν΄ ν¨μ λ΄μμ μμ£Ό μ‘μΈμ€νλ κ°μ λ‘μ»¬λ‘ μΊμν©λλ€. μλ₯Ό λ€μ΄ ν¨μ λ΄μμ μ¬μ©μ IDμ μ¬λ¬ λ² μ‘μΈμ€ν΄μΌ νλ κ²½μ° AsyncLocalStorage
μμ ν λ² κ²μνμ¬ νμ μ¬μ©μ μν΄ λ‘컬 λ³μμ μ μ₯ν©λλ€.
3. λͺ ννκ³ μΌκ΄λ λͺ λͺ κ·μΉ μ¬μ©
AsyncLocalStorage
μ μ μ₯νλ ν€μ λν΄ λͺ
ννκ³ μΌκ΄λ λͺ
λͺ
κ·μΉμ μ¬μ©ν©λλ€. μ΄λ κ² νλ©΄ μ½λ κ°λ
μ±κ³Ό μ μ§ κ΄λ¦¬μ±μ΄ ν₯μλ©λλ€. μλ₯Ό λ€μ΄ request.id
λλ user.id
μ κ°μ΄ νΉμ κΈ°λ₯ λλ λλ©μΈκ³Ό κ΄λ ¨λ λͺ¨λ ν€μ λν΄ μΌκ΄λ μ λμ¬λ₯Ό μ¬μ©ν©λλ€.
4. μ¬μ© ν μ 리
AsyncLocalStorage
λ λΉλκΈ° μμ
μ΄ μλ£λλ©΄ μ€ν λ¦¬μ§ μ»¨ν
μ€νΈλ₯Ό μλμΌλ‘ μ 리νμ§λ§ λ μ΄μ νμνμ§ μμ λ μ€ν λ¦¬μ§ μ»¨ν
μ€νΈλ₯Ό λͺ
μμ μΌλ‘ μ 리νλ κ²μ΄ μ’μ΅λλ€. μ΄λ κ² νλ©΄ λ©λͺ¨λ¦¬ λμλ₯Ό λ°©μ§νκ³ μ±λ₯μ ν₯μμν¬ μ μμ΅λλ€. exit
λ©μλλ₯Ό μ¬μ©νμ¬ μ»¨ν
μ€νΈλ₯Ό λͺ
μμ μΌλ‘ μ 리ν μ μμ΅λλ€.
5. μ±λ₯ μν₯ κ³ λ €
νΉν λμμ±μ΄ λμ νκ²½μμ AsyncLocalStorage
λ₯Ό μ¬μ©νλ λ° λ°λ₯Έ μ±λ₯ μν₯μ μΈμνμμμ€. μ½λλ₯Ό λ²€μΉλ§νΉνμ¬ μ±λ₯ μꡬ μ¬νμ μΆ©μ‘±νλμ§ νμΈνμμμ€. μ ν리μΌμ΄μ
μ νλ‘νμΌλ§νμ¬ μ»¨ν
μ€νΈ κ΄λ¦¬μ κ΄λ ¨λ μ μ¬μ μΈ λ³λͺ© νμμ μλ³ν©λλ€. AsyncLocalStorage
κ° νμ©ν μ μλ μ±λ₯ μ€λ²ν€λλ₯Ό λ°μμν€λ κ²½μ° λͺ
μμ 컨ν
μ€νΈ μ λ¬κ³Ό κ°μ λ체 μ κ·Ό λ°©μμ κ³ λ €νμμμ€.
6. λΌμ΄λΈλ¬λ¦¬μμ μ£Όμν΄μ μ¬μ©
μΌλ°μ μΌλ‘ μ¬μ©νλ €λ λΌμ΄λΈλ¬λ¦¬μμ AsyncLocalStorage
λ₯Ό μ§μ μ¬μ©νμ§ λ§μμμ€. λΌμ΄λΈλ¬λ¦¬λ μ¬μ©λλ 컨ν
μ€νΈμ λν΄ κ°μ ν΄μλ μ λ©λλ€. λμ μ¬μ©μκ° μ»¨ν
μ€νΈ μ 보λ₯Ό λͺ
μμ μΌλ‘ μ λ¬ν μ μλ μ΅μ
μ μ 곡νμμμ€. μ΄λ κ² νλ©΄ μ¬μ©μκ° μ ν리μΌμ΄μ
μμ 컨ν
μ€νΈλ₯Ό κ΄λ¦¬νλ λ°©λ²μ μ μ΄νκ³ μ μ¬μ μΈ μΆ©λμ΄λ μκΈ°μΉ μμ λμμ λ°©μ§ν μ μμ΅λλ€.
AsyncLocalStorageμ λν λμ
AsyncLocalStorage
λ νΈλ¦¬νκ³ κ°λ ₯ν λꡬμ΄μ§λ§ λͺ¨λ μλ리μ€μ κ°μ₯ μ ν©ν μ루μ
μ μλλλ€. κ³ λ €ν΄μΌ ν λͺ κ°μ§ λμμ λ€μκ³Ό κ°μ΅λλ€.
1. λͺ μμ 컨ν μ€νΈ μ λ¬
κ°μ₯ κ°λ¨ν μ κ·Ό λ°©μμ 컨ν μ€νΈ μ 보λ₯Ό ν¨μμ λν μΈμλ‘ λͺ μμ μΌλ‘ μ λ¬νλ κ²μ λλ€. μ΄ μ κ·Ό λ°©μμ κ°λ¨νκ³ μ΄ν΄νκΈ° μ½μ§λ§ μ½λμ 볡μ‘μ±μ΄ μ¦κ°ν¨μ λ°λΌ λ²κ±°λ‘μμ§ μ μμ΅λλ€. λͺ μμ 컨ν μ€νΈ μ λ¬μ 컨ν μ€νΈκ° λΉκ΅μ μκ³ μ½λκ° κΉκ² μ€μ²©λμ§ μμ κ°λ¨ν μλ리μ€μ μ ν©ν©λλ€. κ·Έλ¬λ λ 볡μ‘ν μλ리μ€μ κ²½μ° μ½κ³ μ μ§ κ΄λ¦¬νκΈ° μ΄λ €μ΄ μ½λλ‘ μ΄μ΄μ§ μ μμ΅λλ€.
2. 컨ν μ€νΈ κ°μ²΄
κ°λ³ λ³μλ₯Ό μ λ¬νλ λμ λͺ¨λ 컨ν
μ€νΈ μ 보λ₯Ό μΊ‘μννλ 컨ν
μ€νΈ κ°μ²΄λ₯Ό λ§λ€ μ μμ΅λλ€. μ΄λ κ² νλ©΄ ν¨μ μλͺ
μ λ¨μννκ³ μ½λλ₯Ό λ μ½κΈ° μ½κ² λ§λ€ μ μμ΅λλ€. 컨ν
μ€νΈ κ°μ²΄λ λͺ
μμ 컨ν
μ€νΈ μ λ¬κ³Ό AsyncLocalStorage
κ°μ μ’μ μ μΆ©μμ
λλ€. κ΄λ ¨ 컨ν
μ€νΈ μ 보λ₯Ό ν¨κ» κ·Έλ£Ήννλ λ°©λ²μ μ 곡νμ¬ μ½λλ₯Ό λ 체κ³μ μ΄κ³ μ΄ν΄νκΈ° μ½κ² λ§λλλ€. κ·Έλ¬λ μ¬μ ν κ° ν¨μμ 컨ν
μ€νΈ κ°μ²΄λ₯Ό λͺ
μμ μΌλ‘ μ λ¬ν΄μΌ ν©λλ€.
3. λΉλκΈ° νν¬(μ§λ¨μ©)
Node.jsμ async_hooks
λͺ¨λμ λΉλκΈ° μμ
μ μΆμ νκΈ° μν λ³΄λ€ μΌλ°μ μΈ λ©μ»€λμ¦μ μ 곡ν©λλ€. AsyncLocalStorage
λ³΄λ€ μ¬μ©νκΈ°κ° λ 볡μ‘νμ§λ§ λ ν° μ μ°μ±κ³Ό μ μ΄λ ₯μ μ 곡ν©λλ€. async_hooks
λ μ£Όλ‘ μ§λ¨ λ° λλ²κΉ
λͺ©μ μΌλ‘ μ¬μ©λ©λλ€. μ΄λ₯Ό ν΅ν΄ λΉλκΈ° μμ
μ μλͺ
μ£ΌκΈ°λ₯Ό μΆμ νκ³ μ€νμ λν μ 보λ₯Ό μμ§ν μ μμ΅λλ€. κ·Έλ¬λ μ μ¬μ μΈ μ±λ₯ μ€λ²ν€λλ‘ μΈν΄ λ²μ© 컨ν
μ€νΈ κ΄λ¦¬μλ κΆμ₯λμ§ μμ΅λλ€.
4. μ§λ¨ 컨ν μ€νΈ(OpenTelemetry)
OpenTelemetryλ μΆμ , λ©νΈλ¦ λ° λ‘κ·Έλ₯Ό ν¬ν¨ν μ격 μΈ‘μ λ°μ΄ν°λ₯Ό μμ§νκ³ λ΄λ³΄λ΄κΈ° μν νμ€νλ APIλ₯Ό μ 곡ν©λλ€. μ§λ¨ 컨ν μ€νΈ κΈ°λ₯μ λΆμ° μμ€ν μμ 컨ν μ€νΈ μ νλ₯Ό κ΄λ¦¬νκΈ° μν κ³ κΈμ μ΄κ³ κ°λ ₯ν μ루μ μ μ 곡ν©λλ€. OpenTelemetryμ ν΅ν©νλ©΄ λ€μν μλΉμ€ λ° νλ«νΌμμ 컨ν μ€νΈ μΌκ΄μ±μ 보μ₯νλ λ²€λ μ€λ¦½μ μΈ λ°©λ²μ μ 곡ν©λλ€. μ΄λ 컨ν μ€νΈλ₯Ό μλΉμ€ κ²½κ³λ₯Ό λμ΄ μ νν΄μΌ νλ 볡μ‘ν λ§μ΄ν¬λ‘ μλΉμ€ μν€ν μ²μμ νΉν μ μ©ν©λλ€.
μ€μ μ
AsyncLocalStorage
λ₯Ό λ€μν μλ리μ€μμ μ¬μ©ν μ μλ μ€μ μλ₯Ό μ΄ν΄λ³΄κ² μ΅λλ€.
1. μ μ μκ±°λ μ ν리μΌμ΄μ : μμ² μΆμ
μ μ μκ±°λ μ ν리μΌμ΄μ
μμ AsyncLocalStorage
λ₯Ό μ¬μ©νμ¬ μ ν μΉ΄νλ‘κ·Έ, μΌν μΉ΄νΈ λ° κ²°μ κ²μ΄νΈμ¨μ΄μ κ°μ μ¬λ¬ μλΉμ€μμ μ¬μ©μ μμ²μ μΆμ ν μ μμ΅λλ€. μ΄λ₯Ό ν΅ν΄ κ° μλΉμ€μ μ±λ₯μ λͺ¨λν°λ§νκ³ μ¬μ©μ κ²½νμ μν₯μ λ―ΈμΉ μ μλ λ³λͺ© νμμ μλ³ν μ μμ΅λλ€.
// API κ²μ΄νΈμ¨μ΄μμ
const { AsyncLocalStorage } = require('async_hooks');
const { v4: uuidv4 } = require('uuid');
const asyncLocalStorage = new AsyncLocalStorage();
app.use((req, res, next) => {
const requestId = uuidv4();
asyncLocalStorage.run(new Map(), () => {
asyncLocalStorage.getStore().set('requestId', requestId);
res.setHeader('X-Request-Id', requestId);
next();
});
});
// μ ν μΉ΄νλ‘κ·Έ μλΉμ€μμ
async function getProductDetails(productId) {
const requestId = asyncLocalStorage.getStore().get('requestId');
// λ€λ₯Έ μΈλΆ μ 보μ ν¨κ» μμ² IDλ₯Ό κΈ°λ‘ν©λλ€.
logger.info(`[${requestId}] μ ν ID: ${productId}μ λν μ ν μΈλΆ μ 보 κ°μ Έμ€λ μ€`);
// ... μ ν μΈλΆ μ 보 κ°μ Έμ€κΈ°
}
2. SaaS νλ«νΌ: λ€μ€ ν λμ
SaaS νλ«νΌμμ AsyncLocalStorage
λ₯Ό μ¬μ©νμ¬ ν
λνΈ IDλ₯Ό μ μ₯νκ³ νμ¬ ν
λνΈλ₯Ό κΈ°λ°μΌλ‘ μμ²μ μ μ ν λ°μ΄ν° μ μ₯μ λλ 리μμ€λ‘ λμ μΌλ‘ λΌμ°ν
ν μ μμ΅λλ€. μ΄λ κ² νλ©΄ κ° ν
λνΈμ λ°μ΄ν°κ° λΆλ¦¬λκ³ μ체 리μμ€μλ§ μ‘μΈμ€ν μ μμ΅λλ€.
// μμ²μμ ν
λνΈ IDλ₯Ό μΆμΆνλ λ―Έλ€μ¨μ΄
app.use((req, res, next) => {
const tenantId = req.headers['x-tenant-id'];
asyncLocalStorage.run(new Map(), () => {
asyncLocalStorage.getStore().set('tenantId', tenantId);
next();
});
});
// νΉμ ν
λνΈμ λν λ°μ΄ν°λ₯Ό κ°μ Έμ€λ ν¨μ
async function fetchData(query) {
const tenantId = asyncLocalStorage.getStore().get('tenantId');
const db = getDatabaseConnection(tenantId);
return db.query(query);
}
3. λ§μ΄ν¬λ‘ μλΉμ€ μν€ν μ²: λ‘κΉ μ»¨ν μ€νΈ
λ§μ΄ν¬λ‘ μλΉμ€ μν€ν
μ²μμ AsyncLocalStorage
λ₯Ό μ¬μ©νμ¬ μ¬μ©μ IDλ₯Ό μ μ₯νκ³ μ¬λ¬ μλΉμ€μ λ‘κ·Έ λ©μμ§μ μλμΌλ‘ ν¬ν¨ν μ μμ΅λλ€. μ΄λ κ² νλ©΄ νΉμ μ¬μ©μμκ² μν₯μ λ―ΈμΉ μ μλ λ¬Έμ λ₯Ό λ μ½κ² λλ²κΉ
νκ³ λΆμν μ μμ΅λλ€.
// μΈμ¦ μλΉμ€μμ
app.use((req, res, next) => {
const userId = req.user.id;
asyncLocalStorage.run(new Map(), () => {
asyncLocalStorage.getStore().set('userId', userId);
next();
});
});
// λ°μ΄ν° μ²λ¦¬ μλΉμ€μμ
async function processData(data) {
const userId = asyncLocalStorage.getStore().get('userId');
logger.info(`[μ¬μ©μ ID: ${userId}] λ°μ΄ν° μ²λ¦¬ μ€: ${JSON.stringify(data)}`);
// ... λ°μ΄ν° μ²λ¦¬
}
κ²°λ‘
AsyncLocalStorage
λ λΉλκΈ° JavaScript νκ²½μμ μμ² λ²μ λ³μλ₯Ό κ΄λ¦¬νκΈ° μν μ μ©ν λꡬμ
λλ€. λΉλκΈ° μμ
μ λ°μμ 컨ν
μ€νΈ κ΄λ¦¬λ₯Ό λ¨μννμ¬ μ½λλ₯Ό λ μ½κΈ° μ½κ³ , μ μ§ κ΄λ¦¬νκΈ° μ½κ³ , μμ νκ² λ§λλλ€. μ¬μ© μ¬λ‘, λͺ¨λ² μ¬λ‘ λ° λμμ μ΄ν΄νλ©΄ AsyncLocalStorage
λ₯Ό ν¨κ³Όμ μΌλ‘ νμ©νμ¬ κ°λ ₯νκ³ νμ₯ κ°λ₯ν μ ν리μΌμ΄μ
μ ꡬμΆν μ μμ΅λλ€. κ·Έλ¬λ μ±λ₯ μν₯μ μ μ€νκ² κ³ λ €νκ³ μ μ¬μ μΈ λ¬Έμ λ₯Ό λ°©μ§νκΈ° μν΄ μ μ€νκ² μ¬μ©νλ κ²μ΄ μ€μν©λλ€. AsyncLocalStorage
λ₯Ό μ¬λ € κΉκ² νμ©νμ¬ λΉλκΈ° JavaScript κ°λ° λ°©μμ κ°μ νμμμ€.
λͺ
νν μ, μ€μ©μ μΈ μ‘°μΈ λ° ν¬κ΄μ μΈ κ°μλ₯Ό ν΅ν©νμ¬ μ΄ κ°μ΄λλ μ μΈκ³ κ°λ°μμκ² JavaScript μ ν리μΌμ΄μ
μμ AsyncLocalStorage
λ₯Ό μ¬μ©νμ¬ λΉλκΈ° 컨ν
μ€νΈλ₯Ό ν¨κ³Όμ μΌλ‘ κ΄λ¦¬νλ μ§μμ μ 곡νλ κ²μ λͺ©νλ‘ ν©λλ€. νΉμ μꡬ μ¬νμ κ°μ₯ μ ν©ν μ루μ
μ 보μ₯νκΈ° μν΄ μ±λ₯ μν₯ λ° λμμ κ³ λ €νλ κ²μ μμ§ λ§μμμ€.